/************************************
 文件明 ： bsp_daly.c
 作者   ： 胡秋峰
 描述   ： 延迟文件
 日志   ： 使用定时器的高精度延迟函数
 ************************************/
#include "bsp_delay.h"

/**
 * @描述    ： 延迟初始化，主要初始化GPT寄存器
 *             GPT定时器时钟源选择ipg_clk=66MHZ
 * @参数    ： 无
 * @返回值  ： 无
 */ 
void delay_init(void)
{
    GPT1->CR = 0;
    GPT1->CR |= (0x1 << 15);
    while ((GPT1->CR >> 15) & 0x1);

    /*
     * GPT CR
     * [22:20]  000 输出比较1的输出功能关闭
     * [9]      0   Restart
     * [8:6]    001 GPT时钟源选择ipg_clk=66MHZ
     */ 
    GPT1->CR |= (0x1 << 6);
    GPT1->PR = 65; /* 66分频 */
    GPT1->OCR[0] = 0XFFFFFFFF;
    GPT1->CR |= (0x1 << 0); /* 使能GPT1 */
}

/**
 * @描述            ： us级别延迟
 * @参数 - udelay   ： 延迟us数
 * @返回值          ： 无
 */ 
void delay_us(uint32_t udealy)
{
    uint32_t old_cnt, new_cnt;
    uint32_t t_cnt_value = 0; /* 走过的总时间 */
    
    old_cnt = GPT1->CNT;
    while(1) {
        new_cnt = GPT1->CNT;
        if (new_cnt != old_cnt) {
            if (new_cnt > old_cnt) {
                t_cnt_value = new_cnt - old_cnt;
            } else {
                t_cnt_value = 0XFFFFFFFF - old_cnt + new_cnt;
            }
            old_cnt = new_cnt;
            if (t_cnt_value >= udealy) {
                break;
            }
        }
    }
}

#if 0
/**
 * @描述    ： 短时间延迟
 * @参数    ： 延迟次数
 * @返回值  ： 无 
 */
static void delay_short(volatile unsigned int n)
{
    while (n--) {}
}
#endif // 0

/**
 * @描述    ： ms级别延迟，在396MHZ主频下
 * @参数    ： 延迟的n ms
 * @返回值  ： 无 
 */
void delay_ms(uint32_t mdelay)
{
    while (mdelay--) {
        delay_us(1000);
    }
}
